#ifndef CALCSTACK_H
#define CALCSTACK_H

template <typename T>//使用模板，能够存储 double 类型的数据、QChar 类型的数据
class CalcStack
{
public:
    CalcStack();
    ~CalcStack();
    bool push(const T & data);
    T pop();
    T top() const;
    bool isFull() const;
    bool isEmpty() const;
private:
    T * m_stack;
    const int MAX_STACK;//栈的最大容量, 超过该容量需要进行错误处理
    int m_sp;
};


template <typename T>
inline CalcStack<T>::CalcStack(): MAX_STACK(100)//默认的最大栈
{
    m_stack = new T[MAX_STACK];
    m_sp = -1;
}

template <typename T>
inline CalcStack<T>::~CalcStack()
{
    delete m_stack;
}

// 入栈操作，如果栈满了就会返回 false
template <typename T>
inline bool CalcStack<T>::push(const T & data)
{
    if (m_sp >= MAX_STACK - 1)
        return false;
    m_stack[++m_sp] = data;
    return true;
}

// 要求在 pop 前，进行 isEmpty 检查, 否则在空栈情况下会返回 0
template <typename T>
inline T CalcStack<T>::pop()
{
    if (m_sp <= -1)
        return 0;
    return m_stack[m_sp--];
}

// 要求在 pop 前，进行 isEmpty 检查, 否则在空栈情况下会返回 0
template <typename T>
inline T CalcStack<T>::top() const
{
    if (m_sp <= -1)
        return '0';
    return m_stack[m_sp];
}

template <typename T>
inline bool CalcStack<T>::isEmpty() const
{
    return m_sp <= -1;
}


template <typename T>
inline bool CalcStack<T>::isFull() const
{
    return m_sp >= MAX_STACK - 1;
}

#endif // CALCSTACK_H
